#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>

//模拟实现strncat

//char* my_strncat(char* dest, char* src, int i) {
//	char* p = dest;
//	while (*dest != '\0') {
//		dest++;
//	}
//	while (i--) {
//		*dest = *src;
//		dest++;
//		src++;
//	}
//	return p;
//}
//
//int main() 
//{char arr1[20] = { "hello world" };
//	char arr2[20] = { "hehe" };
//	int n = 2;
//	char* ret =  my_strncat(arr1, arr2, n);
//	printf("%s", arr1);
//	return 0;
//}

//模拟实现strncpy
//char* my_strncpy(char* dest, char* src, int n, int m)
//{
//	char* p = dest;
//	if (n < m) {
//		//先把src的内容全部拷贝完
//		for (int k = n; k > 0; k--) {
//			*dest = *src;
//			dest++;
//			src++;
//		}
//
//		//src的长度<dest的长度 然后开始用空字符替代
//		for (int i = m - n; i > 0; i--) {
//			*dest = 'x';
//			dest++;
//		}
//		return p;
//	}
//	else {
//		for (int k = n; k > 0; k--) {
//			*dest = *src;
//			dest++;
//			src++;
//		}
//	}
//}
//
//int main() {
//	char arr1[20] = { "hello bit" };
//	char arr2[20] = { "skr" };
//	char arr3[20] = { "hello bit" };
//	int m= strlen(arr1);
//	int n = strlen(arr2);
//	char* ret = my_strncpy(arr1, arr2, n, m);
//	printf("%s\n", ret);
//	printf("%s", arr3);
//	return 0;
//}

//模拟实现atoi
//int my_atoi(char* p) 
//    {
//        int n = 0;
//        while (*p != '\0')
//        {
//            n = n * 10 +(*p - '0');
//            p++;
//        }
//        return n;
//    }
//
//
//int main() {
//	char arr1[20] = { "114514" };
//	int n = strlen(arr1);
//	int ret = my_atoi(arr1);
//    printf("%d", ret);
//	return 0;
//}

//找单身狗，但是有两只
#include<stdio.h>

void FindTwoNum(int arr[], int n, int* pnum1, int* pnum2)
{
	int i = 0;
	int sum = 0;

	//先找到两个数互相异或的结果
	for (i = 0; i < n; i++)
	{
		sum ^= arr[i];
	}

	int pos = 0;

	//再找到有分歧的一位。在这一位上，两个数一定是一个1 一个0
	for (i = 0; i < 32; i++)
	{
		if ((sum >> i) & 1)
		{
			pos = i;
			break;
		}
	}

	for (i = 0; i < n; i++)
	{
		if ((arr[i] >> pos) & 1)
		{
			*pnum1 ^= arr[i]; //这一位是1的，放在数1里
		}
		else
		{
			*pnum2 ^= arr[i]; //这一位是0的，放在数2里
		}
	}
}

int main()
{
	int arr[] = { 1,1,4,4,5,7,77,7,5,8,88,8 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int num1 = 0;
	int num2 = 0;
	FindTwoNum(arr, sz, &num1, &num2);

	printf("%d  %d\n", num1, num2);

	return 0;
}